【玩转嵌入式屏幕显示】(七)LCD中文字符显示机制

您所在的位置:网站首页 深圳欢乐谷 万圣夜 【玩转嵌入式屏幕显示】(七)LCD中文字符显示机制

【玩转嵌入式屏幕显示】(七)LCD中文字符显示机制

2023-10-21 22:32| 来源: 网络整理| 查看: 265

本文源码和工具开源地址:​​https://github.com/Mculover666/HAL_Driver_Lib​​。

一、字符显示机制 1. 字符显示原理

LCD通过一个个像素点,要在LCD上显示一个字符,需要以下两步:

① 占据屏幕上的一块地方,大小由字体大小说了算;② 在占据的地方上依次控制每个像素点是否显示。

比如中文字符24×24字体大小表示水平需要24个像素点、垂直需要24个像素点。

在这块24×24的地盘上,每个像素点是否显示由字模说了算,字模中的每1位数据表示一个像素点,如果该位为0则表示此处像素点不显示、为1则表示显示(阴码规则)。

所以,字符显示的函数只需要基于打点函数实现即可。在程序中逐位读取字模,如果该位为0则该点写入背景颜色,如果该位为1则写入前景颜色。

【玩转嵌入式屏幕显示】(七)LCD中文字符显示机制_中文

2. 字模生成(点阵字体)

正因为LCD显示字符的机制,所以该种字体被称为点阵字体。

为了方便大家理解原理,这里我首先使用小工具生成字模。

设置工具的字模生成规则如下,阴码、逐行式、顺向取模、C51格式:

【玩转嵌入式屏幕显示】(七)LCD中文字符显示机制_取模_02

接着生成汉字的字模:

【玩转嵌入式屏幕显示】(七)LCD中文字符显示机制_取模_03

接着复制生成数据,在程序中定义为一个二维数组作为字库,第一个值表示字库中的元素个数,可以由编译器自行判断,第二个值是每个元素的大小,必须要指明,这样我们就可以用 ​​hz_16x16[0]​​ 来找到汉字 ”春”在字库中的位置:

#ifndef _HZ_H_#define _HZ_H_const unsigned char hz_16x16[][32] = {{0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x02,0x00,0xFF,0xFE,0x08,0x20,0x10,0x10,0x2F,0xE8,0xC8,0x26,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0},/*"春",0*//* (16 X 16 , 宋体 )*/};#endif /* _HZ_H_*/

我们选择的字体是16x16,所以:

水平方向有16个像素点,每个像素点占1位,需要16bit,两个字节来表示一行;垂直方向有16行,所以整体有2*16=32个字节;

此处需要注意,软件每16个字节生成一对花括号,这会影响二维数组取值,需要将中间多余的花括号去除。

二、如何将字符显示到LCD 1. 打点函数支持

字符显示需要打点函数的支持,这里我使用RGB-LCD的打点函数:

void lcd_draw_point(uint16_t x, uint16_t y, uint16_t color); 2. 字库支持

引入刚刚我们创建二维数组的头文件:

#include "hz.h" 2. 读取字模显示void lcd_show_chinese(uint16_t x, uint16_t y, char ch, uint16_t back_color, uint16_t font_color, uint8_t font_size){ uint16_t i, j; uint16_t x_pos, y_pos, size, font_width, font_height; uint8_t *font_ptr; uint8_t bit_width, temp; if((x > (LCD_WIDTH - font_size)) || (y > (LCD_HEIGHT - font_size))) { return; } x_pos = x; y_pos = y; font_height = font_size; font_width = font_size; bit_width = 8; size = (font_width / 8 + ((font_width % 8) ? 1 : 0)) * font_height; font_ptr = (uint8_t*)&hz_16x16[ch]; for (i = 0; i < size; i++) { temp = *(font_ptr + i); for (j = 0; j < bit_width; j++) { if(temp & 0x80){ lcd_draw_point(x_pos, y_pos, font_color); } else { lcd_draw_point(x_pos, y_pos, back_color); } temp


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3